#include <iostream>
#include <signal.h>
#include <unistd.h>

// void handler(int sig)
// {
//     printf("Signal %d received\n", sig);
// }

// int main()
// {
//     signal(SIGINT, handler);
//     sigset_t set, oldset;
//     sigemptyset(&set);
//     sigaddset(&set, SIGINT);

//     /* 阻塞 */
//     sigprocmask(SIG_BLOCK, &set, &oldset);
//     printf("SIGINT block, Please wait 5s....\n");
//     int n = sigismember(&set, SIGINT);
//     printf("%d\n", n);
//     sleep(5);

//     /* 解除 */
//     sigprocmask(SIG_SETMASK, &oldset, NULL);
//     // sigprocmask(SIG_UNBLOCK, &set, NULL);
//     printf("SIGINT will unblock, Please wait 5s....\n");
//     sleep(5);
//     printf("I will send SIGINT to me!\n");
//     raise(SIGINT);

//     return 0;
// }

void Printpending(sigset_t &pending)
{
    printf("我是一个进程,我的pid: %d  ", getpid());
    for (int sig = 31; sig >= 1; --sig)
    {
        if (sigismember(&pending, sig)) /* 如果存在这个信号就为1 */
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void handler(int sig)
{
    printf("===============================\n");
    std::cout << "递达" << sig << "信号" << std::endl;
    printf("打印信号是否屏蔽\n");
    sigset_t pending;
    sigpending(&pending);
    Printpending(pending); // 1. 0000 0010(handler执行完，2号才回被设置为0) 2. 0000 0000(执行handler方法之前，2对应的pending已经被清理了)，这边情况是第二种
    printf("===============================\n");

}

int main()
{
    signal(SIGINT, handler);
    sigset_t set, oldset;
    /* 阻塞SIGINT信号 */
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, &oldset);

    int cnt = 0;
    while (true)
    {
        /* 获取当前进程的未决信号集 */
        sigset_t pending;
        sigpending(&pending);
        Printpending(pending);

        /* 解除阻塞 */
        if (cnt == 10)
        {
            printf("解除对2号信号的屏蔽\n");
            sigprocmask(SIG_SETMASK, &oldset, nullptr);
        }

        sleep(1);
        cnt++;
    }

    return 0;
}